package graphs;

import java.util.ArrayList;
import java.util.List;

/**
 * Class for the edges of a graph
 * @author Ballarini Robin
 * @version 16/12/2013
 * @param <T> type of the element stored in the edges of the graph
 * @param <E> type of the element stored in the vertices of the graph
 */
public class Edge<T extends Comparable<T>,E>{
	
	/** Premier noeud adjacent*/
	private Vertex<T,E> v1;
	
	/** Deuxieme noeud adjacent*/
	private Vertex<T,E> v2;
	
	/** Element contenu dans this, poids*/
	private T weight;
	
	/** Position dans les listes de l'objet graphe*/ 
	private int position;
	
	/** Positions des noeuds adjacents dans l'objet graphe*/
	private int inc1;
	private int inc2;
	
	/**
	 * Constructeur de base
	 */
	public Edge() {
		v1=null;
		v2=null;
		weight=null;
		position=-1; // Position : pas encore integre dans le graphe
		inc1=-1;
		inc2=-1;
	}
	
	/**
	 * Constructeur
	 * 
	 * @param n1 premier noeud adjacent
	 * @param n2 deuxieme noeud adjacent
	 * @param w element de l'arete (poids)
	 * @param pos position de l'arete dans la liste de l'objet graphe
	 */
	public Edge(Vertex<T,E> n1,Vertex<T,E> n2,T w,int pos){
		v1=n1;
		v2=n2;
		weight=w;
		position=pos;
		
		List<Edge<T,E>> list1=v1.getInc();
		List<Edge<T,E>> list2=v2.getInc();
		list1.add(this);
		list2.add(this);
		inc1=list1.size()-1;
		inc2=list2.size()-1;
	}
	
	/**
	 * @return les noeuds extremites de this dans une liste de longueur 2
	 */
	public List<Vertex<T,E>> getVertex(){
		ArrayList<Vertex<T,E>> t=new ArrayList<Vertex<T,E>>();
		t.add(v1);
		t.add(v2);
		return t;
	}
	
	/**
	 * @return le poids de this
	 */
	public T getWeight() {
		return weight;
	}
	
	/**
	 * met le poids de this a w
	 * @param w le nouveau poids de this
	 */
	public void setWeight(T w){
		weight=w;
	}
	
	/**
	 * @return la position de this dans la liste du graphe
	 */
	public int getPosition(){
		return position;
	}
	
	/**
	 * @return le premier noeud extremite de this
	 */
	public Vertex<T,E> getFirstVertex(){
		return v1;
	}
	
	/**
	 * @return le deuxieme noeud extremite de this
	 */
	public Vertex<T,E> getSecondVertex(){
		return v2;
	}
	
	/**
	 * 
	 * @param v, un noeud
	 * @return la position de v dans la liste du graphe si adjacent a this, -1 sinon
	 */
	public int getIndex(Vertex<T,E> v){
		if(v==null){
			return -1;
		}
		else{
			if(v==v1){
				return inc1;
			}
			else if(v==v2){
				return inc2;
			}
			else{
				return -1;
			}
		}
	}
}
